/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.afcepf.projet2.metiers.donnees.dao.implementations.comptes;

import fr.afcepf.projet2.metiers.donnees.dao.implementations.DaoGenericImpl;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.comptes.IDaoUtilisateur;
import fr.afcepf.projet2.metiers.donnees.entites.comptes.Adresse;
import fr.afcepf.projet2.metiers.donnees.entites.comptes.Utilisateur;
import fr.afcepf.projet2.metiers.webservices.comptes.UtilisateurInexistantException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;

/**
 * @see IDaoUtilisateur
 * @author Sylvain
 */
@Stateless(name="DaoUtilisateurImpl")
public class DaoUtilisateurImpl extends DaoGenericImpl<Utilisateur, Integer> implements IDaoUtilisateur {

    @Override
    public Utilisateur obtenirParEmail(final String email) throws UtilisateurInexistantException {
        try {
            Utilisateur utilisateur = (Utilisateur) obtenirEntityManager()
                    .createNamedQuery("Utilisateur.findByEmail")
                    .setParameter("email", email)
                    .getSingleResult();
        List<Adresse> adresses = getAdresses(utilisateur);
        utilisateur.setAdresse(adresses);
        return utilisateur;
        } catch(javax.persistence.NoResultException ex) {
            throw new UtilisateurInexistantException(email);
        }
       
    }

    @Override
    public Utilisateur AjouterAdresse(final int idUtilisateur,final int idAdresse) {
        Utilisateur utilisateur = obtenirEntityManager().find(Utilisateur.class, idUtilisateur);
        Adresse adresse = obtenirEntityManager().find(Adresse.class, idAdresse);
        utilisateur.addAdresse(adresse);
        return utilisateur;
    }
    
    @Override
    public Utilisateur obtenirParIdUtilisateur(int idUtilisateur) 
            throws UtilisateurInexistantException {
        Utilisateur utilisateur = obtenirEntityManager().find(Utilisateur.class, idUtilisateur);
        if (utilisateur ==null)
        {
                throw new UtilisateurInexistantException();
        }
        
        List<Adresse> adresses = getAdresses(utilisateur);
        utilisateur.setAdresse(adresses);
        return utilisateur;
    }
        
     private List<Adresse> getAdresses(Utilisateur utilisateur){
                
        List<Adresse> adresses = utilisateur.getAdresse();
        int cpt = 0; // On limite la boucle
        while (cpt < 10 && adresses.isEmpty())
        {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(DaoUtilisateurImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (adresses.isEmpty())
        {
            adresses=new ArrayList<>();
        }
        return adresses;
    }
}
